package com.alibaba.chaosblade.box.common.common.domain.definition;

import com.alibaba.fastjson.annotation.JSONField;
import lombok.AccessLevel;
import lombok.Data;
import lombok.experimental.FieldDefaults;

import java.util.HashMap;
import java.util.Map;

/**
 * 实验流程节点参数定义
 *
 */
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
public class ExperimentNodeArgumentsDefinition {

    /**
     * 已废弃
     */
    @Deprecated
    Map<String, String> matcher = new HashMap<>();

    /**
     * 如果小程序是chaos.xxxx.xxx这样的类型，参数就填这里
     */
    Map<String, String> action = new HashMap<>();

    /**
     * 如果小程序不是以chaos开头，属于用户自定义的小程序，需要把参数填在这里
     */
    @JSONField(name = "user_args")
    Map<String, String> userArgs = new HashMap<>();

    Map<String, SceneFunctionParameterComponent> argsComponents = new HashMap<>();

    /**
     * 添加参数到action和userArgs映射中，并从matcher中移除该参数（如果存在）
     * 
     * @param key 参数键
     * @param value 参数值
     */
    public void addArgs(String key, String value) {
        // 从已废弃的matcher中移除参数
        if (matcher != null) {
            matcher.remove(key);
        }
        // 添加参数到action映射中
        if (action != null) {
            action.put(key, value);
        }
        // 添加参数到userArgs映射中
        if (userArgs != null) {
            userArgs.put(key, value);
        }
    }

    /**
     * 从所有参数映射中移除指定键的参数
     * 
     * @param key 要移除的参数键
     */
    public void removeArg(String key) {
        // 从matcher中移除参数
        if (matcher != null) {
            matcher.remove(key);
        }
        // 从action中移除参数
        if (action != null) {
            action.remove(key);
        }
        // 从userArgs中移除参数
        if (userArgs != null) {
            userArgs.remove(key);
        }
    }

    /**
     * 获取所有参数的合并映射，包括action、matcher和userArgs中的参数
     * 注意：matcher已被标记为废弃，仅为了兼容性保留
     * 
     * @return 包含所有参数的映射
     */
    @JSONField(serialize = false)
    public Map<String, String> getAllArguments() {
        Map<String, String> arguments = new HashMap<>();
        // 添加action参数
        if (action != null) {
            arguments.putAll(action);
        }
        // 添加matcher参数（已废弃）
        if (matcher != null) {
            arguments.putAll(matcher);
        }
        // 添加userArgs参数
        if (userArgs != null) {
            arguments.putAll(userArgs);
        }
        return arguments;
    }

}
